package Server;

/*
 * File:    VallaSecundariaLabel.java
 * Coms:    Getiona los labels de esta valla.
 * Si hay imagen pendiente de para mostrar cada label muestra la suya. durante el tiempo acordado por el cliente
 * Si no hay imagenes encoladas, se duerme, a la espera de que llegan nuevas imagenes
 * 		   
 */

/**
 * @author Daniel Cabrera Ebana - 686013
 * @author Alberto Sanchez Romero - 662385
 * @since 
 */
import java.awt.Container;
import java.awt.Image;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;

public class VallaSecundariaLabel implements Runnable {
	private static File directorio;
	private static JFrame frame;
	private int idlabel;
	private Border border;
	private static Container content;
	private GestorRecursos gestor;
	private ImageIcon banner;
	private static JLabel[] labels = new JLabel[4];

	/**
	 * Constructor del label de la valla secundaria
	 * 
	 * @param GestorRecursos
	 * @param File
	 * @param JFrame
	 * @param Container
	 * @param JLabel
	 *            []
	 * @param idlabel
	 * 
	 * 
	 * @see x.java
	 */

	public VallaSecundariaLabel(GestorRecursos gr, File dir, JFrame f,
			Container c, JLabel[] label, int idlabel) {
		VallaSecundariaLabel.directorio = dir;
		VallaSecundariaLabel.frame = f;
		border = LineBorder.createGrayLineBorder();
		content = c;
		gestor = gr;
		this.idlabel = idlabel;
		VallaSecundariaLabel.labels = label;

		banner = new ImageIcon(directorio
				+ System.getProperty("file.separator")
				+ "espacioDisponible.jpg");
		System.out.println("Proceso :::: " + idlabel);

		labels[idlabel] = new JLabel(banner);
		labels[idlabel].setHorizontalTextPosition(JLabel.LEFT);
		labels[idlabel].setVerticalTextPosition(JLabel.BOTTOM);
		labels[idlabel].setBorder(border);
		content.add(labels[idlabel]);

	}

	public void run() {

		// System.out.println("label arrancado " + idlabel);
		boolean colocada = false;
		String nombreTiempo = "";
		String nombreImg = "";
		int tiempo = 0;

		while (true) {
			// si no hay imgaenes y lo ultimo colocado es una imagen, ponemos el
			// banner
			if (gestor.getsize(2) == 0 && colocada) {
				System.out.println("Banner....");
				updateLabelValla(idlabel, banner);
				colocada = false;

			}
			// El monitorLabel2 gestiona si el Thread debe dormirse o tiene
			// trabajo para realizar
			gestor.getMonitorL2().getElem();

			if (gestor.getsize(2) > 0) {
				// otra funcion con notiffyall, en el momento que haya recursos
				// gestor getsize(2)>0 notifyAll();

				nombreTiempo = gestor.getImg(2);
				nombreImg = nombreTiempo.substring(0,
						nombreTiempo.lastIndexOf(','));
				tiempo = Integer.parseInt((nombreTiempo.substring(nombreTiempo
						.lastIndexOf(',') + 1)));

				System.out.println("Proceso :::: " + idlabel);
				System.out.println("Nombre :::: " + nombreImg);
				System.out.println("Tiempo :::: " + tiempo);

				updateLabelValla(idlabel, getImg(nombreImg)); // gestor.setAddImgEnValla(2);
				colocada = true;
				gestor.setAddSegundos(2, gestor.calcularTmp(tiempo));// 1
																		// segundos,
																		// por
																		// un
																		// delay
																		// que
																		// se
																		// produce
				sleepy(tiempo);
				gestor.setMinusImgEnValla(2);
			}

		}

	}

	/**
	 * Actualiza el contenido del Label indicado, con la imagen que se le pasa
	 * 
	 * @param casilla
	 * @param ImageIcon
	 * 
	 */

	private static void updateLabelValla(int casilla, ImageIcon img) {

		content.remove(labels[casilla]);
		System.out.println("Actualizando....");
		labels[casilla].setIcon(img);
		content.add(labels[casilla]);

		// repintamos el frame
		frame.repaint();
	}

	/**
	 * Actualiza el contenido del Label indicado, con la imagen del banner
	 * 
	 * @param casilla
	 * @param ImageIcon
	 * 
	 */

	public static void updateBanner(int casilla, ImageIcon img) {
		content.remove(labels[casilla]);

		labels[casilla].setIcon(img);
		content.add(labels[casilla]);
		// repintamos el frame
		frame.repaint();

	}

	/**
	 * Duerme el proceso durante el tiempo indicado en segundos
	 * 
	 * @param seconds
	 * 
	 */
	private static void sleepy(int i) {

		try {
			Thread.sleep(i * 1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Escala la imagen
	 * 
	 * @param nameImg
	 * @return ImageIcon
	 */
	public static ImageIcon getImg(String nombreImg) {

		ImageIcon imagen = new ImageIcon(directorio
				+ System.getProperty("file.separator") + nombreImg);
		Image imagescale = imagen.getImage();
		Image newimg = imagescale.getScaledInstance(300, 300,
				java.awt.Image.SCALE_SMOOTH);
		ImageIcon imgfinal = new ImageIcon(newimg);

		return imgfinal;
	}

}
